package com.spring.boot.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @author ZhuYouBin
 * @version 1.0.0
 * @Date: 2022/11/5 15:45
 * @Description
 */
@RestController
@RequestMapping("/api/jedis/bound")
public class RedisBoundDemo {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @GetMapping("/string")
    public String boundValueOps() {
        // 操作字符串
        // 使用bound方法的时候，需要指定操作哪个 key 的数据
        BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps("k1");
        // 因为已经指定要操作的了 key 了，所以后面进行各种操作的时候，不需要重复指定 key 值
        // 添加元素，并且设置过期时间
        ops.set("v100", 10, TimeUnit.SECONDS);
        // 查询元素
        Object val = ops.get();
        System.out.println("k1=" + val);
        // 获取过期时间
        Long expire = ops.getExpire();
        System.out.println(expire);
        return "success.";
    }

    @GetMapping("/list")
    public String boundListOps() {
        // 操作 List 集合
        // 使用bound方法的时候，需要指定操作哪个 key 的数据
        BoundListOperations<String, Object> ops = redisTemplate.boundListOps("lk1");
        // 因为已经指定要操作的了 key 了，所以后面进行各种操作的时候，不需要重复指定 key 值
        // 添加元素
        ops.leftPush("v100");
        ops.rightPushAll("v200", "v300", "v400");
        // 获取数据
        Object val = ops.rightPop();
        System.out.println(val);
        // 获取某个范围的集合数据
        List<Object> range = ops.range(0, -1);
        System.out.println(range);
        return "success.";
    }

    @GetMapping("/set")
    public String boundSetOps() {
        // 操作 List 集合
        // 使用bound方法的时候，需要指定操作哪个 key 的数据
        BoundSetOperations<String, Object> ops = redisTemplate.boundSetOps("zk1");
        // 因为已经指定要操作的了 key 了，所以后面进行各种操作的时候，不需要重复指定 key 值
        // 添加元素
        ops.add("v100", "v200", "v300", "v400");
        // 获取元素
        Set<Object> members = ops.members();
        System.out.println(members);
        // 判断是否存在成员
        Boolean exists = ops.isMember("v600");
        System.out.println(exists);
        // 随机获取一个成员
        Object val = ops.randomMember();
        System.out.println(val);
        return "success.";
    }

    @GetMapping("/hash")
    public String boundHashOps() {
        // 操作 List 集合
        // 使用bound方法的时候，需要指定操作哪个 key 的数据
        BoundHashOperations<String, Object, Object> ops = redisTemplate.boundHashOps("hk1");
        // 因为已经指定要操作的了 key 了，所以后面进行各种操作的时候，不需要重复指定 key 值
        // 添加元素
        ops.put("f1", "v100");
        Map<String, String> map = new HashMap<>();
        map.put("f2", "v200");
        map.put("f3", "v300");
        ops.putAll(map);
        // 获取所有的 hashKey
        Set<Object> keys = ops.keys();
        System.out.println(keys);
        // 获取所有的 val值
        List<Object> values = ops.values();
        System.out.println(values);
        // 获取所有的 key-value
        Map<Object, Object> entries = ops.entries();
        System.out.println(entries);
        return "success.";
    }

    @GetMapping("/zset")
    public String boundZSetOps() {
        // 操作 List 集合
        // 使用bound方法的时候，需要指定操作哪个 key 的数据
        BoundZSetOperations<String, Object> ops = redisTemplate.boundZSetOps("zs1");
        // 因为已经指定要操作的了 key 了，所以后面进行各种操作的时候，不需要重复指定 key 值
        // 添加元素
        ops.add("v100", 10);
        ops.add("v200", 20);
        ops.add("v300", 30);
        // 获取排名
        Long rank = ops.rank("v200");
        System.out.println("rank=" + rank);
        // 获取分数
        Double score = ops.score("v300");
        System.out.println("score=" + score);
        return "success.";
    }

}
